package com.itheima.reggie.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.itheima.reggie.common.BaseContext;
import com.itheima.reggie.entity.*;
import com.itheima.reggie.mapper.OrdersMapper;
import com.itheima.reggie.mapper.ShoppingCartMapper;
import com.itheima.reggie.service.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;

/**
 * @author ：石破天
 * @date ：Created in 2022年12月20日
 * @description ：
 * @version: 1.0
 */
@Service
@Slf4j
public class OrdersServiceImpl extends ServiceImpl<OrdersMapper, Orders> implements OrdersService {

    @Autowired
    private AddressBookService addressBookService;

    @Autowired
    private UserService userService;

    @Autowired
    private ShoppingCartService shoppingCartService;

    @Autowired
    private OrderDetailService orderDetailService;



    @Override
    @Transactional
    public void submit(Orders orders) {
// 1: 构建一个完成的Orders对象
        // 1.1 解析 orders 得到已知数据
        //地址簿id
        Long addressBookId = orders.getAddressBookId();
        // 备注
        String remark = orders.getRemark();
        //支付方式
        Integer payMethod = orders.getPayMethod();
        // 1.2:先查询了 需要的一些信息对象
        // 先去查询 收货人地址信息  通过地址簿id查询
        AddressBook addressBook = addressBookService.getById(addressBookId);
        // 根据登录用户id 查询用户信息
        Long userId = BaseContext.getCurrentId();
        User user = userService.getById(userId);

        //订单号
        long number = IdWorker.getId();
        //下单支付时间
        LocalDateTime now = LocalDateTime.now();

        orders.setNumber(number+"");//订单id
        orders.setOrderTime(now);//下单时间
        orders.setCheckoutTime(now);//结账时间
        orders.setUserId(userId);//用户id
        orders.setPhone(addressBook.getPhone());
        orders.setAddress(addressBook.getDetail());//只用详情
        // 省市区 我们没有结合进来。
        orders.setConsignee(addressBook.getConsignee());
        orders.setUserName(user.getName());

        //总金额
        BigDecimal amount = new BigDecimal(0);
        //中间做累加计算 --- 知道每个 订单明细单价*份数 累加

        // 2：所有该用户的购物项 ===转换成 订单明细
        // 2.1 查询该用户的所有购物项
        // select * from shopping_cart where user_id = ?
        LambdaQueryWrapper<ShoppingCart> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(ShoppingCart::getUserId,userId);
        List<ShoppingCart> shoppingCarts = shoppingCartService.list(wrapper);
        log.info("哥们要开始转换。。。注意力要集中！！");
        // 购物项 转换成 订单明细
        // 构建订单明细空集合
        List<OrderDetail> orderDetails = new ArrayList<>();
        // List<ShoppingCart>=====>List<OrderDetail>
        //遍历得到每个购物项   创建一个新的订单明细  把数据转换过去 存到订单项列表中
        for (ShoppingCart shoppingCart : shoppingCarts) {
            //创建 订单明细对象
            OrderDetail orderDetail = new OrderDetail();
            // 有没有什么字段不要复制
            BeanUtils.copyProperties(shoppingCart,orderDetail,"id");
            // 是不是还有一段 订单id
            orderDetail.setOrderId(number);//订单明细里面 订单id 叫OrderId
            //添加集合中
            orderDetails.add(orderDetail);
            //  计算总金额
            //遍历一个购物项  拿出 单价*份数 把值累加给  总金额
            BigDecimal danjia = shoppingCart.getAmount();
            BigDecimal fenshu = new BigDecimal(shoppingCart.getNumber());
            // 算出小计
            BigDecimal xiaoji = danjia.multiply(fenshu);
            amount = amount.add(xiaoji);

        }

        //实收金额
        orders.setAmount(amount);

        //保存 订单信息 到 订单表
        this.save(orders);
        // 把 这个 订单明细 存到数据库
        orderDetailService.saveBatch(orderDetails);
        log.info("即将清空购物车");
        // 购物项清空
        // delete from shopping_cart where user_id=?
        shoppingCartService.remove(wrapper);
    }
}
